#!/bin/bash

# Valores constantes e pré-definições do script.

rede='192.168'
dir_inst='/tmp'
dir_log="$dir_inst/netbios.subnetwork.log"
dir_log_range="$dir_log/range.$1"
arq_log_range="$dir_log_range/`date '+%d.%m.%y'`.range.$1"

# Testa se a quantidade de parâmentros fornecidos equivale ao requisitado pelo script para funcionar corretamente. 

if [ $# -ne 3 ]
	then
	echo
	echo "Você passou um número incorreto de parâmetros!"
	echo "USO: ./$0 <range_de_ip> <primeiro_ip_do_range> <ultimo_ip_do_range>"
	echo
	exit 1
fi

# Testa se o primeiro parâmetro é um número. Se não for, o programa sai com erro 2. Se for número, este é avaliado se está entre 1 e 254. Se não estiver, o programa sai com erro 2.

if [[ $1 != [0-9]* ]]
	then
	echo
	echo "O range digitado não é um número."
	echo
	exit 2
	else
	if [ $1 -lt 1 -o $1 -gt 254 ] 
		then
		echo
		echo "Você passou um range impossível!"
		echo "O range vai de 1 até 254."
		echo
		exit 2
	fi
fi 

# Testa se o segundo parâmetro é um número. Se não for, o programa sai com erro 3. Se for número, este é avaliado se está entre 1 e 254. Se não estiver, o programa sai com erro 3.

if [[ $2 != [0-9]* ]]
	then
	echo
	echo "O ip inicial digitado não é um número."
	echo
	exit 3
	else
	if [ $2 -lt 1 -o $2 -gt 254 ] 
		then
		echo
		echo "Você passou um ip inicial impossível!"
		echo "O ip inicial vai de 1 até 254."
		echo
		exit 3
	fi
fi 

# Testa se o terceiro parâmetro é um número. Se não for, o programa sai com erro 4. Se for número, este é avaliado se está entre o segundo parâmetro e 254. Se não estiver, o programa sai com erro 4.

if [[ $3 != [0-9]* ]]
	then
	echo
	echo "O ip final digitado não é um número."
	echo
	exit 4
	else
	if [ $3 -lt $2 -o $3 -gt 254 ] 
		then
		echo
		echo "Você passou um ip final impossível!"
		echo "O ip final vai de $2 até 254."
		echo
		exit 4
	fi
fi 

# Testa se o diretório atual corresponde ao /tmp. Se não for o script troca o diretorio para /tmp.

if [ "`pwd`" != '/tmp' ]
	then
	cd /tmp
fi

# Testa se o diretório existe, caso não exista é criado.

if [ ! -d "$dir_log" ]
	then
	mkdir "$dir_log"
fi

# Testa se o subdiretório existe, caso não exista é criado.

if [ ! -d "$dir_log_range" ]
	then
	mkdir "$dir_log_range"
fi


# Testa se o arquivo de registro já existe. Se sim, é feito um histórico do registro no arquivo ".archive".
# Em desuso.

#if [ -e "$arq_log_range" ]
#	then
#	cat "$arq_log_range" >> "$arq_log_range.archive"
#fi

# Código principal do script.
# É uma laço "until" cuja função é armazenar a saída do comando "nmblookup" na variável "nmbusca" para cada ip do escopo definido. Depois, é testado se há retorno na variável "ip_win" após um "grep -i 'MAC' (comum a todos os registros encontrados). Se houver retorno, é armazenado num "buffer nmbusca_util" os "greps" com os dados interessados. E por último o "buffer nmbusca_util" despeja todo o seu conteúdo num "buffer" chamado "log_range". Se a variável "ip_win" estiver vazia naquela instância, o "buffer log_range" não é acrescido.

ip=$2
until [ $ip -gt $3 ]
	do
	nmbusca="`nmblookup -A "$rede.$1.$ip"`"
	ip_win="$(echo "$nmbusca" | grep -i 'MAC')"
	if [ ! -z "$ip_win" ]
		then
		nmbusca_util="$(echo "$nmbusca" | grep "$rede.$1.$ip")"
		nmbusca_util="$(echo -e "$nmbusca_util\n""$(echo "$nmbusca" | grep '<00>')")"
		nmbusca_util="$(echo -e "$nmbusca_util\n""$(echo "$nmbusca" | grep -i 'MAC')")"
		log_range="$(echo -e "$log_range""$nmbusca_util\n")"
		else
		log_range="$log_range"
	fi
	ip=$(($ip+1))
	done

# Cabeçalho do registro em arquivo. 

echo -e "\n--- `date '+%d.%m.%y %H:%M:%S'` ---" >> "$arq_log_range"

# Se o "buffer log_range" estiver vazio, uma mensagem avisando ausência de estações netbios é enviada para registro em arquivo. Do contŕario, os dados contidos no "buffer log_range" são despejados no arquivo.

if [ -z "$log_range" ]
	then
	echo "Não há nenhuma estação Netbios no momento! Execute o script novamente mais tarde." >> "$arq_log_range"
	else
	echo "$log_range " >> "$arq_log_range"
fi
